//
// Created by YANHAI on 2019/4/21.
//

// 三目运算符功能增强

#include <iostream>

using namespace std;

/*
 * 1. 在C语言中是编译不通过的，
 *    在C语言中 表达式的结果 放在寄存器中，表达式的返回值是一个数
 *    (a < b ? a : b) = 30; 这一行 就相当于 10 = 30;
 *
 * 2. 在C++中。表达式返回的是变量的本身
 * 3. C++编译器如何做到的，让表达式返回一个内存空间... 内存首地址(指针)
 * 4. 在C语言中如何实现C++的效果： *(a < b ? &a : &b) = 30;
 * 5. 本质：C++编译器 帮我们完成了 取地址的工作
 */

int main()
{
    int a = 10;
    int b = 20;

    // 返回一个最小数 并且给最小数的变量赋值成30
    // 三目运算符是一个表达式，表达式不可能做左值
    (a < b ? a : b) = 30;
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

/*
 * 结论：
 *   1. C语言返回变量的值，C++语言是返回变量本身
 *      C语言中的三目运算符返回的是变量值，不能作为左值使用
 *      C++中的三目运算符可直接返回变量本身，因此可以出现在程序的任何地方
 *   2. 注意： 三目运算符可能返回的值中如果有一个是常量值，则不能作为左值使用
 *      (a < b ? 1 : b) = 30;
 *   3. C语言如何支持类似C++的特性呢？
 *      ==> 当左值得条件：要有内存空间；C++编译器帮助我们取了一个地址而已
 */
